﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Noris.Schedule.Support
{
	#region class UserDataList : Třída, která umožňuje programátorovi odkládat si svoje data a příště je zase najít.
	/// <summary>
	/// UserDataList : Třída, která umožňuje programátorovi odkládat si svoje data a příště je zase najít.
    /// V aktuální verzi nepodporuje persistenci, data scope je per jedno spuštění.
    /// </summary>
    public class UserDataList
    {
        public UserDataList()
        {
            this.Values = new Dictionary<string, object>();
        }
        protected Dictionary<string, object> Values;
        /// <summary>
        /// Přidá / Upraví libovolná data.
        /// Pokud pod daným klíčem data již existují, přepíše je.
        /// Pokud neexistují, vloží nová.
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public void SetData(string key, object value)
        {
            if (this.Values.ContainsKey(key))
                this.Values[key] = value;
            else
                this.Values.Add(key, value);
        }
        /// <summary>
        /// Vrátí příznak, zda existují data pod daným klíčem.
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool ContainsKey(string key)
        {
            return this.Values.ContainsKey(key);
        }
        /// <summary>
        /// Najde a vrátí data uložená pod daný klíč metodou AddData.
        /// Pokud data nebyla uložena, vrátí defaultValue.
        /// Za shodnost datového typu nese odpovědnost volající.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        public T GetData<T>(string key, T defaultValue)
        {
            if (this.Values.ContainsKey(key))
			{
				object value = this.Values[key];
				if (value is T)
					return (T)value;
			}
            return defaultValue;
        }
		/// <summary>
		/// Zkusí najít data pro daný klíč, daného typu.
		/// Pokud data najde, vrátí true a data vloží do out parametru.
		/// Pokud data nenajde, vrací false (a v parametru data bude default (T).
		/// Pokud data najde ale neodpovídají typu T, chová se jako by data nebyla nalezena.
		/// </summary>
		/// <typeparam name="T"></typeparam>
		/// <param name="key"></param>
		/// <param name="data"></param>
		/// <returns></returns>
		public bool TryGetData<T>(string key, out T data)
		{
			if (this.Values.ContainsKey(key))
			{
				object value = this.Values[key];
				if (value is T)
				{
					data = (T)value;
					return true;
				}
			}
			data = default(T);
			return false;
		}
    }
	#endregion
}
